home *** CD-ROM | disk | FTP | other *** search
/ CICA 1995 September (Japanese) / CICA Shareware for Windows CD-ROM (Walnut Creek) (September 1995) (Japanese) (Disc 2).iso / disc2 / nt / ntperf.exe / PERFTOOLS / SRC / PERFMON / STATUS.C_ / STATUS.C
Encoding:
C/C++ Source or Header  |  1993-05-15  |  13.6 KB  |  459 lines

  1. #include "perfmon.h"
  2. #include "status.h"  // External declarations for this file
  3. #include <stdio.h>   // for sprintf.
  4. #include <stdarg.h>  // For ANSI variable args. Dont use UNIX <varargs.h>
  5.  
  6. #include "log.h"        // for LogCollecting
  7. #include "perfmops.h"   // for SmallFileSizeString
  8. #include "playback.h"   // for PlayingBackLog
  9. #include "utils.h"
  10.  
  11. //================================//
  12. // Options for PaintStatusBar     //
  13. //================================//
  14. #define     PaintText         1
  15. #define     PaintIcons        2
  16. #define     PaintBoundary     4
  17. #define     PaintAll          (PaintText + PaintIcons + PaintBoundary)
  18.  
  19. //==========================================================================//
  20. //                                  Constants                               //
  21. //==========================================================================//
  22.  
  23. #define szStatusClass          TEXT("PerfmonStatusClass")
  24. #define dwStatusClassStyle     (CS_HREDRAW | CS_VREDRAW | CS_OWNDC)
  25. #define iStatusClassExtra      (0)
  26. #define iStatusWindowExtra     (0)
  27. #define dwStatusWindowStyle    (WS_CHILD | WS_VISIBLE) 
  28.  
  29.  
  30. #define szAlertMax            TEXT(" 99 ")
  31. #define szAlertFormat         TEXT(" %2d ")
  32. #define szAlertOverflow       TEXT(" ++")
  33.  
  34. #define szLogMax              TEXT(" 9,999.9M ")
  35.  
  36. //==========================================================================//
  37. //                                Local Data                                //
  38. //==========================================================================//
  39.  
  40.  
  41. HDC            hStatusDC ;                   // for OWN_DC
  42.  
  43. HDC            hLogBitmapDC ;
  44. int            xLogBitmapWidth ;     
  45. int            yLogBitmapHeight ;
  46.  
  47. HDC            hAlertBitmapDC ;
  48. int            xAlertBitmapWidth ;     
  49. int            yAlertBitmapHeight ;     
  50.  
  51. int            yStatusHeight ;
  52. int            xStatusAlertWidth ;           // of alert bm and num alerts
  53. int            xStatusLogWidth ;             // of log bitmap and file size
  54.  
  55. int            szStatusLineLen ;             // no. of char. in szStatusLine
  56. TCHAR          szStatusLine [MessageLen+ResourceStringLen] ;
  57. TCHAR          szCurrentActivity [ResourceStringLen] ;
  58. TCHAR          szStatusFormat  [ResourceStringLen] ;
  59. TCHAR          szStatusFormat2 [ResourceStringLen] ;
  60.  
  61. HBITMAP        hBitmapAlertStatus ;
  62. HBITMAP        hBitmapLogStatus ;
  63.  
  64.  
  65.  
  66. //==========================================================================//
  67. //                                   Macros                                 //
  68. //==========================================================================//
  69.  
  70.  
  71. #define StatusTopMargin()     (2)
  72. #define StatusLeftMargin()    (2)
  73.  
  74.  
  75. //==========================================================================//
  76. //                              Local Functions                             //
  77. //==========================================================================//
  78.  
  79.  
  80. void DrawAlerts (HDC hDC,
  81.                  LPRECT lpRect)
  82.    {
  83.    TCHAR          szText [10] ;
  84.    RECT           rectText ;
  85.    int            yBitmapTop ;     
  86.  
  87.    if (!iUnviewedAlerts)
  88.       return ;
  89.  
  90.    yBitmapTop = lpRect->top +
  91.                 (lpRect->bottom - 
  92.                  lpRect->top - 
  93.                  yAlertBitmapHeight) / 2 ;
  94.  
  95.    SetTextColor (hDC, crLastUnviewedAlert) ;
  96.  
  97.    BitBlt (hDC,                           // DC for Destination surface
  98.       lpRect->right - xStatusAlertWidth,  // x pos for Destination surface
  99.       yBitmapTop,                         // y for Destination surface
  100.       xAlertBitmapWidth,                  // width of bitmap
  101.       yAlertBitmapHeight,                 // height of bitmap
  102.       hAlertBitmapDC,                     // DC for source surface
  103.       0, 0,                               // location in source surface
  104.       SRCCOPY) ;                          // ROP code
  105.    
  106.    SetTextColor (hDC, crBlack) ;
  107.  
  108.    if (iUnviewedAlerts > 99)
  109.       lstrcpy (szText, szAlertOverflow) ;
  110.    else
  111.       TSPRINTF (szText, szAlertFormat, iUnviewedAlerts) ;
  112.  
  113.    rectText.left = lpRect->right - xStatusAlertWidth + xAlertBitmapWidth ;
  114.    rectText.top = lpRect->top + 1 ;
  115.    rectText.right = lpRect->right - 1 ;
  116.    rectText.bottom = lpRect->bottom - 1 ;
  117.  
  118.    ExtTextOut (hDC, rectText.left, rectText.top, ETO_CLIPPED | ETO_OPAQUE,
  119.       &rectText, szText, lstrlen (szText), NULL) ;
  120.  
  121.    lpRect->right -= (xStatusAlertWidth + (xAlertBitmapWidth >> 2)) ;
  122.    }  // DrawAlerts
  123.  
  124.  
  125. void DrawLog (HDC hDC,
  126.               LPRECT lpRect)
  127.    {
  128.    TCHAR          szText [10] ;
  129.    RECT           rectText ;
  130.    int            yBitmapTop ;     
  131.  
  132.    if (!LogCollecting (hWndLog))
  133.       return ;
  134.  
  135.    yBitmapTop = lpRect->top +
  136.                 (lpRect->bottom - 
  137.                  lpRect->top - 
  138.                  yLogBitmapHeight) / 2 ;
  139.    BitBlt (hDC,                           // DC for Destination surface
  140.       lpRect->right - xStatusLogWidth,    // x pos for Destination surface
  141.       yBitmapTop,                         // y for Destination surface
  142.       xLogBitmapWidth,                    // width of bitmap
  143.       yLogBitmapHeight,                   // height of bitmap
  144.       hLogBitmapDC,                       // DC for source surface
  145.       0, 0,                               // location in source surface
  146.       SRCCOPY) ;                          // ROP code
  147.  
  148.  
  149.    SmallFileSizeString (LogFileSize (hWndLog), szText) ;
  150.  
  151.    rectText.left = lpRect->right - xStatusLogWidth +
  152.       xLogBitmapWidth + 1 ;
  153.    rectText.top = lpRect->top + 1 ;
  154.    rectText.right = lpRect->right - 1 ;
  155.    rectText.bottom = lpRect->bottom - 1 ;
  156.  
  157.    ExtTextOut (hDC, rectText.left, rectText.top, ETO_CLIPPED | ETO_OPAQUE,
  158.       &rectText, szText, lstrlen (szText), NULL) ;
  159.  
  160.    lpRect->right -= xStatusLogWidth ;
  161.    }  // DrawLog
  162.  
  163.  
  164. //==========================================================================//
  165. //                              Message Handlers                            //
  166. //==========================================================================//
  167.  
  168.  
  169. void static OnCreate (HWND hWnd)
  170. /*
  171.    Effect:        Perform any actions needed when a status window is created.
  172.                   In particular, set the instance data to initial values,
  173.                   determine the size and placement of the various elements
  174.                   of the status display.
  175.  
  176.    Called By:     StatusWndProc only, in response to a WM_CREATE message.
  177. */
  178.    {  // OnCreate
  179.    HDC            hDC ;
  180.  
  181.  
  182.    hBitmapAlertStatus = LoadBitmap (hInstance, idBitmapAlertStatus) ;
  183.    hBitmapLogStatus = LoadBitmap (hInstance, idBitmapLogStatus) ;
  184.  
  185.    hDC = hStatusDC = GetDC (hWnd) ;
  186.    SelectFont (hDC, hFontScales) ;
  187.    SetBkColor (hDC, ColorBtnFace) ;
  188.    SetTextAlign (hDC, TA_LEFT) ;
  189.    SetBkMode (hDC, OPAQUE) ;
  190.  
  191.    yStatusHeight = 2 * StatusTopMargin () + 
  192.                    FontHeight (hDC, TRUE) +
  193.                    2 * ThreeDPad ;
  194.    
  195.    // pre-load the log and alert bitmaps for perfmormance
  196.    xLogBitmapWidth = BitmapWidth (hBitmapLogStatus) ;
  197.    yLogBitmapHeight = BitmapHeight (hBitmapLogStatus) ;
  198.    xAlertBitmapWidth = BitmapWidth (hBitmapAlertStatus) ;
  199.    yAlertBitmapHeight = BitmapHeight (hBitmapAlertStatus) ;
  200.  
  201.    hLogBitmapDC = CreateCompatibleDC (hDC) ;
  202.    SelectObject (hLogBitmapDC, hBitmapLogStatus) ;
  203.  
  204.    hAlertBitmapDC = CreateCompatibleDC (hDC) ;
  205.    SelectObject (hAlertBitmapDC, hBitmapAlertStatus) ;
  206.  
  207.  
  208.    xStatusAlertWidth = xAlertBitmapWidth + 1 +
  209.                        TextWidth (hDC, szAlertMax) ;
  210.    xStatusLogWidth = xLogBitmapWidth +
  211.                      TextWidth (hDC, szLogMax) ;
  212.  
  213.  
  214.    StringLoad (IDS_CURRENTACTIVITY, szCurrentActivity) ;
  215.    StringLoad (IDS_STATUSFORMAT, szStatusFormat) ;
  216.    StringLoad (IDS_STATUSFORMAT2, szStatusFormat2) ;
  217.  
  218.    StatusLineReady (hWnd) ;
  219.    }  // OnCreate
  220.  
  221. void static OnDestroy (HWND hWnd)
  222.    {
  223.    if (hBitmapAlertStatus)
  224.       {
  225.       DeleteObject (hBitmapAlertStatus) ;
  226.       hBitmapAlertStatus = 0 ;
  227.       }
  228.  
  229.    if (hBitmapLogStatus)
  230.       {
  231.       DeleteObject (hBitmapLogStatus) ;
  232.       hBitmapLogStatus = 0 ;
  233.       }
  234.    ReleaseDC (hWnd, hStatusDC) ;
  235.  
  236.    }  // OnDestroy
  237.  
  238. void static PaintStatusBar (HWND hWnd, HDC hDC, int PaintOptions)
  239. /*
  240.    Effect:        Paint the invalid surface of hWnd. Draw each label, each
  241.                   recessed value box, and each value.
  242.  
  243.    Called By:     StatusWndProc only, in response to a WM_PAINT message.
  244. */
  245.    {
  246.    RECT           rectClient ;
  247.  
  248.    if (bPerfmonIconic)
  249.       {
  250.       // no need to draw anything if iconic
  251.       return ;
  252.       }
  253.  
  254.    GetClientRect (hWnd, &rectClient) ;
  255.  
  256.    RectContract (&rectClient, StatusTopMargin (), StatusLeftMargin ()) ;
  257.    
  258.    if (PaintOptions == PaintAll)
  259.       {
  260.       ThreeDConcave1 (hDC,
  261.                      rectClient.left, rectClient.top,
  262.                      rectClient.right, rectClient.bottom) ;
  263.       }
  264.  
  265.    rectClient.left += StatusLeftMargin () ;
  266.  
  267.    // Always draw the icons and need to draw log before Alerts!
  268.    DrawLog (hDC, &rectClient) ;
  269.    DrawAlerts (hDC, &rectClient) ;
  270.  
  271.    if (PaintOptions & PaintText)
  272.       {
  273.       rectClient.left += 1 ;
  274.       rectClient.top += 1 ;
  275.       rectClient.right -= 1 ;
  276.       rectClient.bottom -= 1 ;
  277.       ExtTextOut (hDC, rectClient.left, rectClient.top, ETO_CLIPPED | ETO_OPAQUE,
  278.          &rectClient, szStatusLine, szStatusLineLen, NULL) ;
  279.       }
  280.  
  281.    }  // PaintStatusBar
  282.  
  283.  
  284.  
  285.  
  286. LRESULT APIENTRY StatusWndProc (HWND hWnd,
  287.                                 WORD wMsg,
  288.                                 WPARAM wParam,
  289.                                 LPARAM lParam)
  290.    {  // StatusWndProc
  291.    BOOL           bCallDefProc ;
  292.    LRESULT        lReturnValue ;
  293.    HDC            hDC ;
  294.    PAINTSTRUCT    ps ;
  295.  
  296.  
  297.    bCallDefProc = FALSE ;
  298.    lReturnValue = 0L ;
  299.  
  300.    switch (wMsg)
  301.       {  // switch
  302.       case WM_PAINT:
  303.          hDC = BeginPaint (hWnd, &ps) ;
  304.          PaintStatusBar (hWnd, hDC, PaintAll) ;
  305.          EndPaint (hWnd, &ps) ;
  306.          break ;
  307.  
  308.       case WM_CREATE:
  309.          OnCreate (hWnd) ;
  310.          break ;
  311.  
  312.       case WM_DESTROY:
  313.          OnDestroy (hWnd) ;
  314.          break ;
  315.  
  316.       default:
  317.          bCallDefProc = TRUE ;
  318.       }  // switch
  319.  
  320.  
  321.    if (bCallDefProc)
  322.       lReturnValue = DefWindowProc (hWnd, wMsg, wParam, lParam) ;
  323.  
  324.    return (lReturnValue);
  325.    }  // StatusWndProc
  326.  
  327.  
  328. int StatusHeight (HWND hWnd)
  329. /*
  330.    Effect:        A status window has a preferred height, based on the font
  331.                   used in its display. Return the preferred height, determined
  332.                   when the window was created.
  333.  
  334.    Assert:        OnCreate has already been called, and it set 
  335.                   StatusData.yHeight.
  336. */  
  337.    {
  338.    return (yStatusHeight) ;
  339.    }
  340.  
  341.  
  342.  
  343.  
  344. HWND CreatePMStatusWindow (HWND hWnd)
  345.    {
  346.    return (CreateWindow (szStatusClass,       // class
  347.                          NULL,                // caption
  348.                          dwStatusWindowStyle, // window style
  349.                          0, 0,                // position
  350.                          0, 0,                // size
  351.                          hWnd,                // parent window
  352.                          NULL,                // menu
  353.                          hInstance,           // program instance
  354.                          NULL)) ;             // user-supplied data
  355.    }  // CreateStatusWindow
  356.  
  357.  
  358.  
  359.  
  360. BOOL StatusInitializeApplication (void)
  361. /*
  362.    Called By:     InitializeApplication only
  363. */
  364.    {
  365.    WNDCLASS       wc ;
  366.  
  367.    wc.style          = dwStatusClassStyle ;
  368.    wc.lpfnWndProc    = (WNDPROC) StatusWndProc ;
  369.    wc.hInstance      = hInstance ;
  370.    wc.cbClsExtra     = iStatusClassExtra ;
  371.    wc.cbWndExtra     = iStatusWindowExtra ;
  372.    wc.hIcon          = NULL ;
  373.    wc.hCursor        = LoadCursor (NULL, IDC_ARROW) ;
  374.    wc.hbrBackground  = hbLightGray ;
  375.    wc.lpszMenuName   = NULL ;
  376.    wc.lpszClassName  = szStatusClass ;
  377.  
  378.    return (RegisterClass (&wc)) ;
  379.    }
  380.    
  381. BOOL _cdecl StatusLine (HWND hWnd,
  382.                         WORD wStringID, ...)
  383.    {
  384.    TCHAR          szFormat [MessageLen] ;
  385.    va_list        vaList ;
  386.  
  387.    if (wStringID == 0)
  388.       {
  389.       return (TRUE) ;
  390.       }
  391.  
  392.    strclr (szStatusLine) ;
  393.  
  394.    if (LoadString (hInstance, wStringID, szFormat, MessageLen))
  395.       {
  396.       va_start (vaList, wStringID) ;
  397.       wvsprintf (szStatusLine, szFormat, vaList) ;
  398.       va_end (vaList) ;
  399.       dwCurrentMenuID = MenuIDToHelpID (wStringID) ;
  400.       szStatusLineLen = lstrlen (szStatusLine) ;
  401.       }
  402.    else
  403.       {
  404.       dwCurrentMenuID = 0 ;
  405.       szStatusLineLen = 0 ;
  406.       }
  407.    PaintStatusBar (hWndStatus, hStatusDC, PaintText + PaintIcons) ;
  408.  
  409.    return (TRUE) ;
  410.    }  // StatusLine
  411.  
  412.  
  413.  
  414. void StatusLineReady (HWND hWnd)
  415.    {
  416.    int         stringLen ;
  417.    LPTSTR      pFileName = NULL ;
  418.  
  419.    TSPRINTF (szStatusLine, szStatusFormat, 
  420.              PlayingBackLog () ? 
  421.                PlaybackLog.szFileTitle : szCurrentActivity) ;
  422.  
  423.    switch (iPerfmonView)
  424.       {
  425.       case IDM_VIEWCHART:
  426.          pFileName = pChartFileName ;
  427.          break ;
  428.  
  429.       case IDM_VIEWALERT:
  430.          pFileName = pAlertFileName ;
  431.          break ;
  432.  
  433.       case IDM_VIEWLOG:
  434.          pFileName = pLogFileName ;
  435.          break ;
  436.  
  437.       case IDM_VIEWREPORT:
  438.          pFileName = pReportFileName ;
  439.          break ;
  440.       }
  441.  
  442.    if (pFileName)
  443.       {
  444.       stringLen = lstrlen (szStatusLine) ;
  445.       TSPRINTF (&szStatusLine[stringLen], szStatusFormat2, pFileName) ;
  446.       }
  447.  
  448.    szStatusLineLen = lstrlen (szStatusLine) ;
  449.  
  450.    PaintStatusBar (hWndStatus, hStatusDC, PaintText + PaintIcons) ;
  451.    }
  452.  
  453.  
  454. void StatusUpdateIcons (HWND hWndStatus)
  455.    {  
  456.    PaintStatusBar (hWndStatus, hStatusDC, PaintIcons) ;
  457.    }
  458.  
  459.